package com.sc.commons.base.repository;

import com.sc.commons.base.dto.BasePageReq;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @author
 */
public interface BaseRepository<T> {
    void save(T o);

    void update(T o);

    void delete(T o);

    T loadEntity(Class<T> c, Serializable id);

    T getEntity(Class<T> userClass, Serializable l);

    T getEntity(String jpql);
    T getEntity(String jpql, Map<String, Object> params);
    T getEntity(String jpql, Object... params);

    <O> O get(Class<O> clazz, String jpql);
    <O> O get(Class<O> clazz, String jpql, Map<String, Object> params);
    <O> O get(Class<O> clazz, String jpql, Object... params);

    List<T> findEntity(String jpql);
    List<T> findEntity(String jpql, Map<String, Object> params);
    List<T> findEntity(BasePageReq page, String jpql, Map<String, Object> params);
    List<T> findEntity(String jpql, Object... params);
    List<T> findEntity(BasePageReq page, String jpql, Object... params);

    <O> List<O> find(Class<O> clazz, String jpql);
    <O> List<O> find(Class<O> clazz, String jpql, Map<String, Object> params);
    <O> List<O> find(Class<O> clazz, BasePageReq page, String jpql, Map<String, Object> params);
    <O> List<O> find(Class<O> clazz, String jpql, Object... params);
    <O> List<O> find(Class<O> clazz, BasePageReq page, String jpql, Object... params);

    <O> List<O> find(JpaQueryUtils<O> jpaQueryUtils);

    int execute(String jpql) ;
    int execute(String jpql, Map<String, Object> params) ;
    int execute(String jpql, Object... params) ;


    public Long count(String jpql);
    public Long count(String jpql, Object... params);
    public Long count(String jpql, Map<String, Object> params);


}
